﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using ICE.Vacations.Logica.Users;
using ICE.Vacations.Logica.Solicitudes;
using ICE.Vacations.Entidades;
using System.IO;
using Microsoft.Reporting.WebForms;
namespace ICE.Vacations.WebASP
{
    public partial class solicitudPropia : System.Web.UI.Page
    {
        //public Recurso usuario;
        
        

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                
                cargarDatosEmpleado();
            }
            catch
            {
                Response.Redirect("Default.aspx", true);
            }
            
        }

        public void cargarDatosEmpleado()
        {
            try
            {


               // if (Session["userDataLoaded"] == null)
                {

                    string username = null; Recurso usuario = null;
                    if (String.IsNullOrEmpty(Request.QueryString["ced"]))
                    {
                        username = (string)Session["username"];
                        Logica.Logueo.Writter.fileWrite("USUARIO USERNAME: " + username, Logica.Logueo.Writter.MessageType.Information);
                        usuario = (Recurso)Session["userObj"];
                    }
                    else
                    {
                        username = Request.QueryString["ced"];
                        usuario = UsersManager.getOtroRecurso(username);
                    }



                    txtNombre.Text = usuario.nombre + " " + usuario.apellido1 + " " + usuario.apellido2;

                    txtCedula.Text = usuario.cedula;
                    try
                    {
                    
                        txtDiasDisponibles.Text = UsersManager.getTodosDiasDisponibles().ToString();
                    }
                    catch
                    {
                        // txtDiasDisponibles.Text = "Error al conectar al base de datos de Recursos Humanos";
                        txtDiasDisponibles.Text = "0";
                    }
                    //txtAprobador1.Text = usuario.aprobador1;
                    //txtAprobador2.Text = usuario.aprobador2;
                    //txtAprobador3.Text = usuario.aprobador3;


                    gridAp.DataSource = (List<string>)Session["aprobadores"];
                    gridAp.DataBind();

                    Session["userDataLoaded"] = "si";
                }
                
            }

            catch
            {
            }

        }

        protected void crearSolicitud_Click(object sender, EventArgs e)
        {
            try
            {
                if (String.IsNullOrEmpty(txtDiasSolicitados.Text))
                {
                    System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Favor seleccione un rango de fechas válido');", true);
                    return;
                }
                if (String.IsNullOrEmpty(txtCodigoVerificacion.Text))
                {
                    System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Debe digitar el código de verificación antes de enviar la solicitud','',alert.Information);", true);
                    return;
                }
                else if (!txtCodigoVerificacion.Text.Equals(UsersManager.getCapcha()))
                {
                    System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Código de verificación inválido','',alert.Information);", true);
                    return;
                }
                

                string cedulaU = txtCedula.Text;
                int diasD = Convert.ToInt32(txtDiasDisponibles.Text);
                int diasS = Convert.ToInt32(txtDiasSolicitados.Text);

                Entidades.Solicitud solicitud = RequestManager.guardarSolicitud((string)Session["username"], cedulaU, cedulaU, diasD, diasS,
                    DateTime.Parse(txtfechaInicio.Text), Convert.ToDateTime(txtFechaFin.Text));

                //Entidades.Solicitud solicitud = RequestManager.guardarSolicitud(Request.LogonUserIdentity.Name,cedulaU, cedulaU, diasD, diasS,
                //    DateTime.Parse(txtfechaInicio.Text), Convert.ToDateTime(txtFechaFin.Text));
               // System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Solicitud [" + solicitud.requestID + "] generada.');", true);

               // Logica.Logueo.Writter.fileWrite("Entrando a CREAR PDF solicitudPropia.aspx", Logica.Logueo.Writter.MessageType.Information);

                string rutaPDF = "";
                //rutaPDF = createPDF(solicitud);
                //Logica.Logueo.Writter.fileWrite("Valor de rutaPDF ["+rutaPDF+"]", Logica.Logueo.Writter.MessageType.Information);
                List<string> listaAP = null;
                try
                {
                    Entidades.Recurso recurso = Logica.Users.UsersManager.getOtroRecurso(solicitud.employeeID);
                    rutaPDF = solicitud.requestID + "_" + solicitud.employeeID + ".pdf";
                    LocalReport report = new LocalReport();
                    report.ReportPath = Server.MapPath("~/bin/") + "Reporte_Solicitud.rdlc";
                    Logica.Logueo.Writter.fileWrite("Ruta del Reporte : " + report.ReportPath, Logica.Logueo.Writter.MessageType.Information);

                    DataSet1 data = new DataSet1();
                    //Este va a ser la forma de ingreso de los parametros para crear el reporte.
                    //Necesito que nivel de base de datos se pueda de alguna forma traer el nombre del aprobador con solo la cedula.
                    listaAP = (List<string>)Session["aprobadores"];

                    data.DataTable1.Rows.Add(solicitud.requestID, solicitud.objectID,
                        recurso.nombre + " " + recurso.apellido1 + " " + recurso.apellido2,
                        solicitud.employeeID,
                        solicitud.fechaInicio.ToString("dd/MM/yyyy"),
                        solicitud.fechaFin.ToString("dd/MM/yyyy"),
                       solicitud.diasSolicitados,
                        solicitud.diasDisponibles,
                        DateTime.Now.ToString("dd/MM/yyyy"),
                        listaAP[0],
                        listaAP[1],
                        listaAP[2]
                        );

                    ReportDataSource rds = new ReportDataSource();
                    rds.Name = "DataSet1";//This refers to the dataset name in the RDLC file
                    rds.Value = data.DataTable1;



                    report.DataSources.Add(rds);

                    //Byte[] mybytes = report.Render("WORD");
                    Byte[] mybytes = report.Render("PDF");
                    using (FileStream fs = File.Create(Server.MapPath("PDF") + "/" + rutaPDF))
                    {
                        fs.Write(mybytes, 0, mybytes.Length);
                        fs.Close();
                        fs.Dispose();
                    }

                }
                catch (Exception exc)
                {
                    Logica.Logueo.Writter.fileWrite("Error PDF: " + exc, Logica.Logueo.Writter.MessageType.Error);

                    Logica.Logueo.Writter.fileWrite("Error PDF: " + exc.Message, Logica.Logueo.Writter.MessageType.Error);

                    throw (exc);
                }


                //rutaPDF = createPDF(solicitud);

                Logica.Logueo.Writter.fileWrite("Valor de rutaPDF despues [" + rutaPDF + "]", Logica.Logueo.Writter.MessageType.Information);


                RequestManager.enviarSolicitud((string)Session["username"], solicitud, Server.MapPath("~/PDF/"));




              

                //Response.ContentType = "application/pdf";
                //Response.AppendHeader("Content-Disposition", "attachment; filename=" + rutaPDF);
                //Response.TransmitFile(Server.MapPath("~/PDF/" + rutaPDF));
                //Response.End();
                Response.Redirect("solicitudC.aspx?file=" + rutaPDF+
                                               "&usna="+txtNombre.Text+
                                               "&usce="+txtCedula.Text+
                    "&didi="+txtDiasDisponibles.Text+
                    "&ap1="+listaAP[0]+
                    "&ap2="+listaAP[1]+
                    "&ap3="+listaAP[2]+
                     "&fein="+txtfechaInicio.Text+
                     "&fefi="+txtFechaFin.Text+
                     "&diso="+txtFechaFin.Text
                    , false);
                
               
            }
            catch (Exception ex)
            {
                System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Error: "+ex.Message+"');", true);
                //Label8.Text = "Error: "+ex.Message;
            }
        
        }


        private string createPDF(Entidades.Solicitud sol )
        {
            Logica.Logueo.Writter.fileWrite("CREAR PDF", Logica.Logueo.Writter.MessageType.Information);
            try
            {
                Entidades.Recurso recurso = Logica.Users.UsersManager.getOtroRecurso(sol.employeeID);
                string ruta = sol.requestID + "_" + sol.employeeID + ".pdf";
                LocalReport report = new LocalReport();
                report.ReportPath = "/"+"Reporte_Solicitud.rdlc";
                Logica.Logueo.Writter.fileWrite("Ruta del Reporte : " + report.ReportPath.ToString(), Logica.Logueo.Writter.MessageType.Information);

                DataSet1 data = new DataSet1();
                //Este va a ser la forma de ingreso de los parametros para crear el reporte.
                //Necesito que nivel de base de datos se pueda de alguna forma traer el nombre del aprobador con solo la cedula.
                List<string> listaAP = (List<string>)Session["aprobadores"];

                data.DataTable1.Rows.Add(sol.requestID, sol.objectID,
                    recurso.nombre + " " + recurso.apellido1 + " " + recurso.apellido2,
                    sol.employeeID,
                    sol.fechaInicio.ToString("dd/MM/yyyy"),
                    sol.fechaFin.ToString("dd/MM/yyyy"),
                   sol.diasSolicitados,
                    sol.diasDisponibles,
                    DateTime.Now.ToString("dd/MM/yyyy"),
                    listaAP[0],
                    listaAP[1],
                    listaAP[2]
                    );

                ReportDataSource rds = new ReportDataSource();
                rds.Name = "DataSet1";//This refers to the dataset name in the RDLC file
                rds.Value = data.DataTable1;



                report.DataSources.Add(rds);
                //Byte[] mybytes = report.Render("WORD");
                Byte[] mybytes = report.Render("PDF");
                using (FileStream fs = File.Create(Server.MapPath("PDF") + "/" + ruta))
                {
                    fs.Write(mybytes, 0, mybytes.Length);
                    fs.Close();
                    fs.Dispose();
                }

                return ruta;



            }
            catch (Exception e)
            {
                Logica.Logueo.Writter.fileWrite("Error PDF: " + e.Message, Logica.Logueo.Writter.MessageType.Error);

                return "";
            }
        }

        protected void txtfechaInicio_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if ((String.IsNullOrEmpty(txtfechaInicio.Text)) && (String.IsNullOrEmpty(txtFechaFin.Text)))
                    return;

                //if (Convert.ToDateTime(txtfechaInicio.Text) < Convert.ToDateTime(txtFechaFin.Text))
                //{
                    txtDiasSolicitados.Text = RequestManager.getDiasSolicitados(Convert.ToDateTime(txtfechaInicio.Text),
                     Convert.ToDateTime(txtFechaFin.Text)).ToString();
                //}
                    txtDiasSolicitados.Focus();

                
            }
            catch (Exception ex)
            {
                //txtDiasSolicitados.Text = ex.Message;
            }
        }

        protected void txtFechaFin_TextChanged(object sender, EventArgs e)
        {
            try
            {
                if ((String.IsNullOrEmpty(txtfechaInicio.Text)) && (String.IsNullOrEmpty(txtFechaFin.Text)))
                    return;

                //if (Convert.ToDateTime(txtfechaInicio.Text) < Convert.ToDateTime(txtFechaFin.Text))
                //{
                    txtDiasSolicitados.Text = RequestManager.getDiasSolicitados(Convert.ToDateTime(txtfechaInicio.Text),
                     Convert.ToDateTime(txtFechaFin.Text)).ToString();
                //}
                    txtDiasSolicitados.Focus();


            }
            catch (Exception ex) 
            {
                //txtDiasSolicitados.Text = ex.Message;
            }
        }

        protected void btnEnviarCodigo_Click(object sender, EventArgs e)
        {
            try
            {
                UsersManager.sendCapcha((string)Session["username"]);
                System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Código de Verificación enviado.');", true);
            }
            catch (Exception ex)
            {
                System.Web.UI.ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "AlertBox", "alert('Error al enviar el código de verificación. "+ex.Message+"');", true);

            }
        }
        


    }
}